{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[![下载Notebook](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/r2.3/resource/_static/logo_notebook.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/r2.3/tutorials/zh_cn/beginner/mindspore_dataset.ipynb)&emsp;[![下载样例代码](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/r2.3/resource/_static/logo_download_code.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/r2.3/tutorials/zh_cn/beginner/mindspore_dataset.py)&emsp;[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/r2.3/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/r2.3/tutorials/source_zh_cn/beginner/dataset.ipynb)\n",
    "\n",
    "[基本介绍](https://www.mindspore.cn/tutorials/zh-CN/r2.3/beginner/introduction.html) || [快速入门](https://www.mindspore.cn/tutorials/zh-CN/r2.3/beginner/quick_start.html) || [张量 Tensor](https://www.mindspore.cn/tutorials/zh-CN/r2.3/beginner/tensor.html) || **数据集 Dataset** || [数据变换 Transforms](https://www.mindspore.cn/tutorials/zh-CN/r2.3/beginner/transforms.html) || [网络构建](https://www.mindspore.cn/tutorials/zh-CN/r2.3/beginner/model.html) || [函数式自动微分](https://www.mindspore.cn/tutorials/zh-CN/r2.3/beginner/autograd.html) || [模型训练](https://www.mindspore.cn/tutorials/zh-CN/r2.3/beginner/train.html) || [保存与加载](https://www.mindspore.cn/tutorials/zh-CN/r2.3/beginner/save_load.html) || [使用静态图加速](https://www.mindspore.cn/tutorials/zh-CN/r2.3/beginner/accelerate_with_static_graph.html)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 数据集 Dataset\n",
    "\n",
    "数据是深度学习的基础，高质量的数据输入将在整个深度神经网络中起到积极作用。MindSpore提供基于Pipeline的[数据引擎](https://www.mindspore.cn/docs/zh-CN/r2.3/design/data_engine.html)，通过[数据集（Dataset）](https://www.mindspore.cn/tutorials/zh-CN/r2.3/beginner/dataset.html)和[数据变换（Transforms）](https://www.mindspore.cn/tutorials/zh-CN/r2.3/beginner/transforms.html)实现高效的数据预处理。其中Dataset是Pipeline的起始，用于加载原始数据。`mindspore.dataset`提供了内置的文本、图像、音频等数据集加载接口，并提供了自定义数据集加载接口。\n",
    "\n",
    "此外MindSpore的领域开发库也提供了大量的预加载数据集，可以使用API一键下载使用。本教程将分别对不同的数据集加载方式、数据集常见操作和自定义数据集方法进行详细阐述。"
   ]
  },
  {
   "metadata": {},
   "cell_type": "code",
   "outputs": [],
   "execution_count": null,
   "source": [
    "%%capture captured_output\n",
    "# 实验环境已经预装了mindspore==2.3.0，如需更换mindspore版本，可更改下面 MINDSPORE_VERSION 变量\n",
    "!pip uninstall mindspore -y\n",
    "!export MINDSPORE_VERSION=2.3.0\n",
    "!pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/${MINDSPORE_VERSION}/MindSpore/unified/aarch64/mindspore-${MINDSPORE_VERSION}-cp39-cp39-linux_aarch64.whl --trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.mirrors.ustc.edu.cn/simple"
   ]
  },
  {
   "metadata": {},
   "cell_type": "code",
   "outputs": [],
   "execution_count": null,
   "source": [
    "# 查看当前 mindspore 版本\n",
    "!pip show mindspore"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from mindspore.dataset import vision\n",
    "from mindspore.dataset import MnistDataset, GeneratorDataset\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据集加载\n",
    "\n",
    "我们使用**Mnist**数据集作为样例，介绍使用`mindspore.dataset`进行加载的方法。"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`mindspore.dataset`提供的接口**仅支持解压后的数据文件**，因此我们使用`download`库下载数据集并解压。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Downloading data from https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/datasets/MNIST_Data.zip (10.3 MB)\n",
      "\n",
      "file_sizes: 100%|██████████████████████████| 10.8M/10.8M [00:02<00:00, 4.15MB/s]\n",
      "Extracting zip file...\n",
      "Successfully downloaded / unzipped to ./\n"
     ]
    }
   ],
   "source": [
    "# Download data from open datasets\n",
    "from download import download\n",
    "\n",
    "url = \"https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/\" \\\n",
    "      \"notebook/datasets/MNIST_Data.zip\"\n",
    "path = download(url, \"./\", kind=\"zip\", replace=True)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "压缩文件删除后，直接加载，可以看到其数据类型为MnistDataset。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'mindspore.dataset.engine.datasets_vision.MnistDataset'>\n"
     ]
    }
   ],
   "source": [
    "train_dataset = MnistDataset(\"MNIST_Data/train\", shuffle=False)\n",
    "print(type(train_dataset))"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据集迭代\n",
    "\n",
    "数据集加载后，一般以迭代方式获取数据，然后送入神经网络中进行训练。我们可以用[create_tuple_iterator](https://www.mindspore.cn/docs/zh-CN/r2.3/api_python/dataset/dataset_method/iterator/mindspore.dataset.Dataset.create_tuple_iterator.html)或[create_dict_iterator](https://www.mindspore.cn/docs/zh-CN/r2.3/api_python/dataset/dataset_method/iterator/mindspore.dataset.Dataset.create_dict_iterator.html)接口创建数据迭代器，迭代访问数据。\n",
    "\n",
    "访问的数据类型默认为`Tensor`；若设置`output_numpy=True`，访问的数据类型为`Numpy`。\n",
    "\n",
    "下面定义一个可视化函数，迭代9张图片进行展示。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "def visualize(dataset):\n",
    "    figure = plt.figure(figsize=(4, 4))\n",
    "    cols, rows = 3, 3\n",
    "\n",
    "    plt.subplots_adjust(wspace=0.5, hspace=0.5)\n",
    "\n",
    "    for idx, (image, label) in enumerate(dataset.create_tuple_iterator()):\n",
    "        figure.add_subplot(rows, cols, idx + 1)\n",
    "        plt.title(int(label))\n",
    "        plt.axis(\"off\")\n",
    "        plt.imshow(image.asnumpy().squeeze(), cmap=\"gray\")\n",
    "        if idx == cols * rows - 1:\n",
    "            break\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 400x400 with 9 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "visualize(train_dataset)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据集常用操作"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Pipeline的设计理念使得数据集的常用操作采用`dataset = dataset.operation()`的异步执行方式，执行操作返回新的Dataset，此时不执行具体操作，而是在Pipeline中加入节点，最终进行迭代时，并行执行整个Pipeline。\n",
    "\n",
    "下面分别介绍几种常见的数据集操作。"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### shuffle\n",
    "\n",
    "数据集随机`shuffle`可以消除数据排列造成的分布不均问题。\n",
    "\n",
    "![op-shuffle](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/r2.3/tutorials/source_zh_cn/advanced/dataset/images/op_shuffle.png)\n",
    "\n",
    "`mindspore.dataset`提供的数据集在加载时可配置`shuffle=True`，或使用如下操作："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 400x400 with 9 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "train_dataset = train_dataset.shuffle(buffer_size=64)\n",
    "\n",
    "visualize(train_dataset)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### map"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`map`操作是数据预处理的关键操作，可以针对数据集指定列（column）添加数据变换（Transforms），将数据变换应用于该列数据的每个元素，并返回包含变换后元素的新数据集。\n",
    "\n",
    "> Dataset支持的不同变换类型详见[数据变换Transforms](https://www.mindspore.cn/tutorials/zh-CN/r2.3/beginner/transforms.html)。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(28, 28, 1) UInt8\n"
     ]
    }
   ],
   "source": [
    "image, label = next(train_dataset.create_tuple_iterator())\n",
    "print(image.shape, image.dtype)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这里我们对Mnist数据集做数据缩放处理，将图像统一除以255，数据类型由uint8转为了float32。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_dataset = train_dataset.map(vision.Rescale(1.0 / 255.0, 0), input_columns='image')"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对比map前后的数据，可以看到数据类型变化。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(28, 28, 1) Float32\n"
     ]
    }
   ],
   "source": [
    "image, label = next(train_dataset.create_tuple_iterator())\n",
    "print(image.shape, image.dtype)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### batch\n",
    "\n",
    "将数据集打包为固定大小的`batch`是在有限硬件资源下使用梯度下降进行模型优化的折中方法，可以保证梯度下降的随机性和优化计算量。\n",
    "\n",
    "![op-batch](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/r2.3/tutorials/source_zh_cn/advanced/dataset/images/op_batch.png)\n",
    "\n",
    "一般我们会设置一个固定的batch size，将连续的数据分为若干批（batch）。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_dataset = train_dataset.batch(batch_size=32)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "batch后的数据增加一维，大小为`batch_size`。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(32, 28, 28, 1) Float32\n"
     ]
    }
   ],
   "source": [
    "image, label = next(train_dataset.create_tuple_iterator())\n",
    "print(image.shape, image.dtype)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 自定义数据集"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`mindspore.dataset`模块提供了一些常用的公开数据集和标准格式数据集的加载API。\n",
    "\n",
    "对于MindSpore暂不支持直接加载的数据集，可以构造自定义数据加载类或自定义数据集生成函数的方式来生成数据集，然后通过`GeneratorDataset`接口实现自定义方式的数据集加载。\n",
    "\n",
    "`GeneratorDataset`支持通过可随机访问数据集对象、可迭代数据集对象和生成器(generator)构造自定义数据集，下面分别对其进行介绍。"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 可随机访问数据集\n",
    "\n",
    "可随机访问数据集是实现了`__getitem__`和`__len__`方法的数据集，表示可以通过索引/键直接访问对应位置的数据样本。\n",
    "\n",
    "例如，当使用`dataset[idx]`访问这样的数据集时，可以读取dataset内容中第idx个样本或标签。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Random-accessible object as input source\n",
    "class RandomAccessDataset:\n",
    "    def __init__(self):\n",
    "        self._data = np.ones((5, 2))\n",
    "        self._label = np.zeros((5, 1))\n",
    "\n",
    "    def __getitem__(self, index):\n",
    "        return self._data[index], self._label[index]\n",
    "\n",
    "    def __len__(self):\n",
    "        return len(self._data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[Tensor(shape=[2], dtype=Float64, value= [ 1.00000000e+00,  1.00000000e+00]), Tensor(shape=[1], dtype=Float64, value= [ 0.00000000e+00])]\n",
      "[Tensor(shape=[2], dtype=Float64, value= [ 1.00000000e+00,  1.00000000e+00]), Tensor(shape=[1], dtype=Float64, value= [ 0.00000000e+00])]\n",
      "[Tensor(shape=[2], dtype=Float64, value= [ 1.00000000e+00,  1.00000000e+00]), Tensor(shape=[1], dtype=Float64, value= [ 0.00000000e+00])]\n",
      "[Tensor(shape=[2], dtype=Float64, value= [ 1.00000000e+00,  1.00000000e+00]), Tensor(shape=[1], dtype=Float64, value= [ 0.00000000e+00])]\n",
      "[Tensor(shape=[2], dtype=Float64, value= [ 1.00000000e+00,  1.00000000e+00]), Tensor(shape=[1], dtype=Float64, value= [ 0.00000000e+00])]\n"
     ]
    }
   ],
   "source": [
    "loader = RandomAccessDataset()\n",
    "dataset = GeneratorDataset(source=loader, column_names=[\"data\", \"label\"])\n",
    "\n",
    "for data in dataset:\n",
    "    print(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[Tensor(shape=[], dtype=Int64, value= 2)]\n",
      "[Tensor(shape=[], dtype=Int64, value= 0)]\n",
      "[Tensor(shape=[], dtype=Int64, value= 1)]\n"
     ]
    }
   ],
   "source": [
    "# list, tuple are also supported.\n",
    "loader = [np.array(0), np.array(1), np.array(2)]\n",
    "dataset = GeneratorDataset(source=loader, column_names=[\"data\"])\n",
    "\n",
    "for data in dataset:\n",
    "    print(data)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 可迭代数据集\n",
    "\n",
    "可迭代的数据集是实现了`__iter__`和`__next__`方法的数据集，表示可以通过迭代的方式逐步获取数据样本。这种类型的数据集特别适用于随机访问成本太高或者不可行的情况。\n",
    "\n",
    "例如，当使用`iter(dataset)`的形式访问数据集时，可以读取从数据库、远程服务器返回的数据流。\n",
    "\n",
    "下面构造一个简单迭代器，并将其加载至`GeneratorDataset`。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Iterator as input source\n",
    "class IterableDataset():\n",
    "    def __init__(self, start, end):\n",
    "        '''init the class object to hold the data'''\n",
    "        self.start = start\n",
    "        self.end = end\n",
    "    def __next__(self):\n",
    "        '''iter one data and return'''\n",
    "        return next(self.data)\n",
    "    def __iter__(self):\n",
    "        '''reset the iter'''\n",
    "        self.data = iter(range(self.start, self.end))\n",
    "        return self"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[Tensor(shape=[], dtype=Int64, value= 1)]\n",
      "[Tensor(shape=[], dtype=Int64, value= 2)]\n",
      "[Tensor(shape=[], dtype=Int64, value= 3)]\n",
      "[Tensor(shape=[], dtype=Int64, value= 4)]\n"
     ]
    }
   ],
   "source": [
    "loader = IterableDataset(1, 5)\n",
    "dataset = GeneratorDataset(source=loader, column_names=[\"data\"])\n",
    "\n",
    "for d in dataset:\n",
    "    print(d)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 生成器\n",
    "\n",
    "生成器也属于可迭代的数据集类型，其直接依赖Python的生成器类型`generator`返回数据，直至生成器抛出`StopIteration`异常。\n",
    "\n",
    "下面构造一个生成器，并将其加载至`GeneratorDataset`。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Generator\n",
    "def my_generator(start, end):\n",
    "    for i in range(start, end):\n",
    "        yield i"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[Tensor(shape=[], dtype=Int64, value= 3)]\n",
      "[Tensor(shape=[], dtype=Int64, value= 4)]\n",
      "[Tensor(shape=[], dtype=Int64, value= 5)]\n"
     ]
    }
   ],
   "source": [
    "# since a generator instance can be only iterated once, we need to wrap it by lambda to generate multiple instances\n",
    "dataset = GeneratorDataset(source=lambda: my_generator(3, 6), column_names=[\"data\"])\n",
    "\n",
    "for d in dataset:\n",
    "    print(d)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.7.6 64-bit ('anaconda3': virtualenv)",
   "metadata": {
    "interpreter": {
     "hash": "5301fd62281359e382b94e8daa1b6fd24b649cc56a97522d87f05e7c3e1510d3"
    }
   },
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6"
  },
  "vscode": {
   "interpreter": {
    "hash": "8c9da313289c39257cb28b126d2dadd33153d4da4d524f730c81a4aaccbd2ca7"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
